# -*- coding: utf-8 -*-
# author : hxt
#   date : 2025/2/21
'''
专门用例Yaml参数化

读取yaml的数据
'''
import copy
import os.path
import yaml,uuid
from apirun.core.globalContext import g_context

def readYaml(file_path):
    """
    返回yaml的数据
    :param file_path: yaml的路径
    :return:
    """
    # 调用一下全局变量的方法写入方法
    load_context_from_yaml(r"D:\hxt\pywork\auto_api\apirun202504ddt\testcase")

    case_infos = []
    with open(file_path, "r", encoding="utf-8") as f:
        #  加载所有数据
        caseinfo = yaml.full_load(f)
        case_infos.append(caseinfo)  # [{yaml里面的数据}]
        return case_infos

def load_context_from_yaml(folder_path):
    '''

    :param folder_path: 文件路径（文件夹）
    :return:
    '''
    try:
        yaml_file_path = os.path.join(folder_path,'context.yaml') #把2个文件进行拼接
        with open(yaml_file_path, 'r', encoding='utf-8') as f:
            # 加载所有的数据
            data = yaml.full_load(f)
            print(f'装载yaml数据内容：{data}')
            # 如果数据不为空，则设置到 全局变量
        if data:g_context().set_by_dict(data)
    except Exception as e:
        print(f'装载yaml文件错误：{str(e)}')
        return False

# load_context_from_yaml(r'D:\hxt\pywork\auto_api\apirun202504ddt\testcase')

def load_yaml_files(config_path):
    '''
    加载满足条件的文件及数据（ xxx(数字）_用例.yml）
    :param config_path: yml存放的路径
    :return:
    '''
    yaml_caseInfos = []  #存储所有的数据
    suite_dir = os.path.join(config_path)

    # 加载全局变量
    load_context_from_yaml(suite_dir)

    # 扫描文件夹下的yaml，获取文件夹下所有的yaml文件
    file_list = [(int(i.split('_')[0]), i) for i in os.listdir(suite_dir) if i.endswith('.yaml') and i.split('_')[0].isdigit()]
    # 文件按数字编号排序，并只保留文件名
    file_list.sort()
    file_list = [i[-1] for i in file_list]

    for i in file_list:
        file_path = os.path.join(suite_dir,i)
        with open(file_path,'r',encoding='utf-8') as f:
            # 加载所有的数据
            caseinfo = yaml.full_load(f)
            yaml_caseInfos.append(caseinfo)
    print('ymal_caseInfos:',yaml_caseInfos)
    return yaml_caseInfos

def yaml_case_parser(config_path):
    '''
    把yaml格式处理成我们规定的格式
    :param config_path:文件路径
    :return:
            {
                "case_infos":case_infos,   #所有的测试用例 []
                "case_names":case_names    #所有测试用例对应的标题 []
            }
    '''
    case_infos = []
    case_names = []

    yaml_case_infos = load_yaml_files(config_path)

    for case_info in yaml_case_infos:
        ddts = case_info.get("ddts",[])

        if len(ddts) == 0:
            case_name = case_info.get('desc', uuid.uuid4().__str__())
            case_info.update({'_case_name': case_name})
            case_infos.append(case_info)
            case_names.append(case_name)
        else:#若有ddts，一个ddt生成一组测试用例
            # 剔除case_info中的ddts，避免后续影响
            case_info.pop("ddts")
            for ddt in ddts:
                # 获取当前用例的context值，若没有，给空字典；若有需更新到ddt中
                context = case_info.get('context', {})
                ddt.update(context)
                new_case = copy.deepcopy(case_info)
                new_case.update({'context':ddt})
                # 用例值和对应的标题

                case_name = f"{case_info.get('desc', uuid.uuid4().__str__())}-{ddt.get('desc',uuid.uuid4().__str__())}"
                new_case.update({'_case_name':case_name})

                case_infos.append(new_case)
                case_names.append(case_name)







    return {
        'case_infos':case_infos,
        'case_names':case_names
    }


# print(yaml_case_parser(r'D:\hxt\pywork\auto_api\apirun202504ddt\testcase'))
# load_yaml_files(r'D:\hxt\pywork\auto_api\apirun202504ddt\testcase')